'use strict';
/**
 * 文件上传，在eggjs中，框架内置了Multipart插件：
 *    解析浏览器上传的multipart/form-data的数据。
 *    提供了file和stream两种处理接口
 *    默认提供了安全的限制
 */

//  获取到用户上传的数据后，可以进行的操作：
//  存储为本地（本demo存储到了本地、public/upload）；
//  提交给第三方服务，
//  大部分时候，会将上传文件转存到云存储服务；
const { Controller } = require('egg');
const path = require('path');
const fs = require('fs');

class UploadController extends Controller {

  async uploadFile() {
    const { ctx } = this;
    const fileLength = ctx.request.files.length;
    const req_body = ctx.request.body;

    try {
      // for (const file of ctx.request.files) {
      const file = ctx.request.files[0];
      // 创建可读流
      const readerStream = fs.createReadStream(file.filepath);
      const savePath = path.join(__dirname, '../public/upload/');
      const savePathAbsolute = savePath + `${file.filename}`;
      //  创建可写流
      const writeStream = fs.createWriteStream(savePathAbsolute);

      if (!fs.existsSync(savePath)) {
        fs.mkdirSync(savePath, err => {
          if (err) {
            throw new Error(err);
          } else {
            readerStream.pipe(writeStream);
            ctx.helper.renderSuccess(ctx, { data: JSON.stringify(savePathAbsolute) });
          }
        });
      } else {
        readerStream.pipe(writeStream);
        ctx.helper.renderSuccess(ctx, { data: savePathAbsolute });
      }
      // }
    } finally {
      // 删除临时文件
      await ctx.cleanupRequestFiles();
    }

  }
}

module.exports = UploadController;
